package complex.java.cast;

/**
 * 此类用于测试java的上下转型问题
 * 
 * @author gaol
 * 
 */

// 车
public class Car {
	public void print() {
		System.out.println("我是一辆车");
	}

	/**
	 * 结论：java上转型不会有问题，但转型后引用的对象仍为子类<br>
	 *       java下转型需要强制转换，只有原来引用的对象与转换的对象一致时才正确，<br>
	 *       否则会报java.lang.ClassCastException
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		Car b = new Car();// 这是一辆车
		Kache kache = new Kache();// 这是一辆卡车
		Tuolaji tuolaji = new Tuolaji();// 这是一辆拖拉机

		b = kache;// 上转型 此时b就是一辆卡车
		b.print();// 此时虽然类型为父类，但实际引用的对象仍为子类
		          // 输出：我是一辆卡车
		// tuolaji = (Tuolaji)b;//下转型 强制把卡车变成拖拉机 肯定有问题（虽然编译不出错）

		// tuolaji = (Tuolaji) new Car();// 下转型 强制把随便一辆车变成拖拉机 肯定有问题(虽然编译不出错)
		kache = (Kache) b; // 下转型 强制把卡车变成卡车 这样是没有问题的
		kache.print();
	}
}

// 卡车
class Kache extends Car {

	public void print() {
		System.out.println("我是一辆卡车");
	}

	public void print1() {
		System.out.println("我是一辆卡车");
	}

}

// 拖拉机
class Tuolaji extends Car {
	public void print() {
		System.out.println("我是一辆拖拉机");
	}

	public void print1() {
		System.out.println("我是一辆拖拉机");
	}
}